package com.designPattern.Template;

/**
 * 【模板方法】
 * 【解决问题】某些子类（同一个父类）需要调用的某个方法里面调用的方法逻辑是相同的
 * 可以在父类添加一个模板方法,里面规定了方法的调用逻辑，具体调用方法的实现可以推迟到子类去实现
 * 可以子类重复去写相同的调用方式，可以专心去实现子类的方法，而不用去在意调用的逻辑
 * 【钩子方法】在模板方法中，不一定所有的方法都是子类需要的（调用顺序不变）,可以让这些方法在父类中空实现
 * 在子类中有选择性的重写，可以避免子类去实现他不需要的方法
 * 【使用场景】子类调用某个方法的逻辑都很相似的情况（例如豆浆制作流程，只是添加材料的过程有不同）
 * @author mxs
 */
public abstract class Game {
    public final void play(){
        init();
        login();
        charge();
        enjoy();
        end();
    }
    public abstract void init();
    public void login(){
        System.out.println("登录账号");
    }

    /**
     * 钩子方法（空实现的方法）
     * 让子类决定是否重写（是否需要实现该方法）
     */
    public void charge(){

    }
    public void enjoy(){
        System.out.println("享受游戏");
    }
    public void end(){
        System.out.println("结束游戏");
    }
}
